﻿// 605 [CF 609E] Minimum spanning tree for each edge.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <algorithm>
#include <memory.h>
using namespace std;
/*
http://oj.daimayuan.top/course/22/problem/981

给定一张 n
 个顶点 m
 条边的带权无向简单图，顶点编号从 1
 到 n
，对于每一条边请求出包含这条边的生成树的最小边权和。

输入格式
第一行两个数 n,m
，表示顶点数和边数。

接下来 m
 行，每行三个整数 u,v,w
，表示 u
 号点和 v
 号点之间有一条边权为 w
 的边。

输出格式
输出共 m
 行，第 i
 行一个整数表示包含第 i
 条边的生成树的最小边权和。

样例输入
5 7
1 2 3
1 3 1
1 4 5
2 3 2
2 5 3
3 4 2
4 5 4
样例输出
9
8
11
8
8
8
9
数据规模
对于 100%
 的数据，保证 1≤n≤2×105,n−1≤m≤2×105,1≤u,v≤n,1≤w≤109
，数据保证图连通。
*/

//未能 ac
struct Node {
    int x, y, v, idx;
    bool operator <(const Node& A)const {
        return v < A.v;
    }
}a[200001];

int n, m, dist[200001], f[200001][21], v[200001][21], fa[200001];
long long q[200001];

struct Edge {
    int y, v;
    Edge(int _y,int _v) {
        y = _y; v = _v;
    }
};
vector<Edge> edge[200001];

int gf(int i) {
    if (i == fa[i])
        return i;
    return fa[i] = gf(fa[i]);
}

void dfs(int x) {
    for(auto i:edge[x])
        if (!dist[i.y]) {
            dist[i.y] = dist[x] + 1;
            f[i.y][0] = x;
            v[i.y][0] = i.v;
            dfs(i.y);
        }
}

int main()
{
    scanf("%d%d",&n,&m);
    for (int i = 1; i <= m; i++) {
        scanf("%d%d%d", &a[i].x, &a[i].y, &a[i].v);
        a[i].idx = i;
    }
    sort(a + 1, a + m + 1);
    for (int i = 1; i <= n; i++)
        fa[i] = i;
    long long res = 0;
    for (int i = 1; i <= m; i++) {
        int x = gf(a[i].x), y = gf(a[i].y);
        if (x != y) {
            res += a[i].v;
            edge[a[i].x].push_back(Edge(a[i].y, a[i].v));
            edge[a[i].y].push_back(Edge(a[i].x, a[i].v));
            fa[x] = y;
        }
    }

    memset(dist, 0, sizeof dist);
    dist[1] = 1;
    dfs(1);

    for (int i = 1; i <= 20; i++)
        for (int j = 1; j <= n; j++) {
            f[j][i] = f[f[j][i - 1]][i - 1];
            v[j][i] = max(v[j][i - 1], v[f[j][i - 1]][i - 1]);
        }

    for (int i = 1; i <= m; i++) {
        int x = a[i].x, y = a[i].y;
        if (dist[x] < dist[y])
            swap(x, y);
        int z = dist[x] - dist[y];
        int ans = 0;
        for (int i = 0; z; z /= 2, ++i)
            if (z & 1)
                ans = max(ans, v[x][i]),
                x = f[x][i];
        if (x != y) {
            for (int i = 20; i >= 0; --i)
                if (f[x][i] != f[y][i]) {
                    ans = max(ans, v[x][i]);
                    ans = max(ans, v[y][i]);
                    x = f[x][i];
                    y = f[y][i];
                }
            ans = max(ans, v[x][0]);
            ans = max(ans, v[y][0]);
        }
        q[a[i].idx] = res - ans + a[i].v;
    }

    for (int i = 1; i <= m; i++)
        printf("%lld\n",q[i]);

}
